#ifndef COMMANDEXECUTOR_H
#define COMMANDEXECUTOR_H

#include <QObject>
#include <QJsonObject>
#include <QString>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QVariantList>

class BackendService;
class DatabaseManager;
class WebSocketServer;
class OpenUrlFileCommand;
class CommitFileToUrlCommand;
class SyncDisksCommand;
class SyncFoldersCommand;
class SyncFilesCommand;
class SyncRootFolderCommand;
class GetNoticeCommand;
class MarkReadNoticeCommand;
class DownloadFileCommand;
class GetKmsFileByFileIdCommand;
class RollbackFileCommand;
class DeleteFileCommand;
class RenameFileCommand;
class RenameFolderCommand;
class DeleteFolderCommand;
class CommitFileCommand;
class LoginCheckinCommand;
class ExchangeAccessTokenCommand;

class CommandExecutor : public QObject
{
    Q_OBJECT

public:
    explicit CommandExecutor(QObject *parent = nullptr);
    
    // 设置 BackendService 实例
    void setBackendService(BackendService *backendService);
    
    // 设置 DatabaseManager 实例
    void setDatabaseManager(DatabaseManager *databaseManager);
    
    // 设置 NetworkAccessManager 实例
    void setNetworkAccessManager();
    
    // 获取 NetworkAccessManager 实例
    QNetworkAccessManager* getNetworkAccessManager() const;
    
    // 设置 WebSocketServer 实例
    void setWebSocketServer(WebSocketServer *webSocketServer);
    
    // 执行 openurlfile 命令
    // 通过 OpenUrlFileCommand 类执行命令
    bool executeOpenUrlFileCommand(const QJsonObject &jsonObj);
    
    // 处理文件删除事件：根据文件路径查找命令记录并提交文件
    void executeCommitFileToUrl(const QString &filePath);
    
    // 执行同步网盘命令
    // 通过 SyncDisksCommand 类执行命令
    Q_INVOKABLE bool executeSyncDisks();
    
    // 执行同步文件夹命令
    // 通过 SyncFoldersCommand 类执行命令
    Q_INVOKABLE bool executeSyncFolders(const QString &diskId);
    
    // 执行同步根文件夹命令
    // 通过 SyncRootFolderCommand 类执行命令
    Q_INVOKABLE bool executeSyncRootFolder(const QString &diskId);
    
    // 执行同步文件命令
    // 通过 SyncFilesCommand 类执行命令
    Q_INVOKABLE bool executeSyncFiles(const QString &folderId);
    
    // 执行获取通知命令
    // 通过 GetNoticeCommand 类执行命令
    Q_INVOKABLE bool executeGetNotice(int readStatus = -1, int type = 0, int currpage = 1, int rowcount = 30);
    
    // 执行标记已读通知命令
    // 通过 MarkReadNoticeCommand 类执行命令
    Q_INVOKABLE bool executeMarkReadNotice(const QString &noticeId);
    
    // 执行下载文件命令
    // 通过 DownloadFileCommand 类执行命令
    Q_INVOKABLE bool executeDownloadFile(const QString &url, const QString &fileName, const QString &fileId);
    
    // 执行通过文件ID获取KmsFile命令
    // 通过 GetKmsFileByFileIdCommand 类执行命令
    Q_INVOKABLE bool executeGetKmsFileByFileId(const QString &fileId);
    
    // 执行回撤文件命令
    // 通过 RollbackFileCommand 类执行命令
    Q_INVOKABLE bool executeRollbackFile(const QString &fileId);
    
    // 执行删除文件命令
    // 通过 DeleteFileCommand 类执行命令
    Q_INVOKABLE bool executeDeleteFile(const QString &fileId);
    
    // 执行重命名文件命令
    // 通过 RenameFileCommand 类执行命令
    Q_INVOKABLE bool executeRenameFile(const QString &fileId, const QString &newName);
    
    // 执行重命名文件夹命令
    // 通过 RenameFolderCommand 类执行命令
    Q_INVOKABLE bool executeRenameFolder(const QString &folderId, const QString &newName);
    
    // 执行删除文件夹命令
    // 通过 DeleteFolderCommand 类执行命令
    Q_INVOKABLE bool executeDeleteFolder(const QString &folderId);
    
    // 执行提交文件命令
    // 通过 CommitFileCommand 类执行命令
    Q_INVOKABLE bool executeCommitFile(const QString &diskId, const QString &folderId, const QString &sourceFileId);
    
    // 执行登录检查命令
    // 通过 LoginCheckinCommand 类执行命令
    Q_INVOKABLE bool executeLoginCheckin(const QString &username, const QString &password, const QString &checkcode = "");
    
    // 执行交换AccessToken命令
    // 通过 ExchangeAccessTokenCommand 类执行命令
    bool executeExchangeAccessToken();
    
    // 获取访问令牌（静态方法，所有实例共享）
    static QString getAccessToken();
    
    // 设置访问令牌（静态方法，所有实例共享）
    static void setAccessToken(const QString &accessToken);

signals:
    // 文件提交完成信号
    void fileCommitCompleted(int resultCode, const QString &message);
    
    // 同步网盘完成信号
    void syncDisksCompleted(int resultCode, const QString &message);
    
    // 同步文件夹完成信号
    void syncFoldersCompleted(int resultCode, const QString &message);
    
    // 同步根文件夹完成信号
    void syncRootFolderCompleted(int resultCode, const QString &message);
    
    // 同步文件完成信号
    void syncFilesCompleted(int resultCode, const QString &message);
    
    // 获取通知完成信号
    void getNoticeCompleted(int resultCode, const QString &message, const QVariantList &notices);
    
    // 标记已读通知完成信号
    void markReadNoticeCompleted(int resultCode, const QString &message, const QString &noticeId);
    
    // 文件下载完成信号
    void downloadFileCompleted(int resultCode, const QString &message, const QString &filePath);
    
    // 文件下载进度信号
    void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
    
    // 获取KmsFile完成信号
    void getKmsFileByFileIdCompleted(int resultCode, const QString &message, const QVariantMap &fileData);
    
    // 回撤文件完成信号
    void rollbackFileCompleted(int resultCode, const QString &message);
    
    // 删除文件完成信号
    void deleteFileCompleted(int resultCode, const QString &message);
    
    // 重命名文件完成信号
    void renameFileCompleted(int resultCode, const QString &message);
    
    // 重命名文件夹完成信号
    void renameFolderCompleted(int resultCode, const QString &message);
    
    // 删除文件夹完成信号
    void deleteFolderCompleted(int resultCode, const QString &message);
    
    // 文件提交完成信号
    void commitFileCompleted(int resultCode, const QString &message);
    
    // 登录结果信号
    void loginResult(int resultCode, const QString &message, const QStringList &domains);
    
    // 用户工作目录创建完成信号
    void userWorkDirectoryCreated(const QString &username, const QString &workDirectory);
    
    // 获取AccessToken完成信号
    void exchangeAccessTokenCompleted(int resultCode, const QString &message, const QString &accessToken);

private:
    BackendService *m_backendService;
    DatabaseManager *m_databaseManager;
    WebSocketServer *m_webSocketServer;
    QNetworkAccessManager *m_networkManager;
    OpenUrlFileCommand *m_openUrlFileCommand;
    CommitFileToUrlCommand *m_commitFileToUrlCommand;
    SyncDisksCommand *m_syncDisksCommand;
    SyncFoldersCommand *m_syncFoldersCommand;
    SyncRootFolderCommand *m_syncRootFolderCommand;
    SyncFilesCommand *m_syncFilesCommand;
    GetNoticeCommand *m_getNoticeCommand;
    MarkReadNoticeCommand *m_markReadNoticeCommand;
    DownloadFileCommand *m_downloadFileCommand;
    GetKmsFileByFileIdCommand *m_getKmsFileByFileIdCommand;
    RollbackFileCommand *m_rollbackFileCommand;
    DeleteFileCommand *m_deleteFileCommand;
    RenameFileCommand *m_renameFileCommand;
    RenameFolderCommand *m_renameFolderCommand;
    DeleteFolderCommand *m_deleteFolderCommand;
    CommitFileCommand *m_commitFileCommand;
    LoginCheckinCommand *m_loginCheckinCommand;
    ExchangeAccessTokenCommand *m_exchangeAccessTokenCommand;
    
    // 静态成员变量，所有 CommandExecutor 实例共享同一个 accessToken
    static QString m_accessToken;
    
private slots:
    // 处理 ExchangeAccessTokenCommand 完成信号，成功后触发同步网盘
    void handleExchangeAccessTokenCompleted(int resultCode, const QString &message, const QString &accessToken);
};

#endif // COMMANDEXECUTOR_H

